[38;2;230;219;116mwith Chests.Ring_Buffers;[0m
[38;2;230;219;116mwith USB.Device.HID.Keyboard;[0m

[38;2;249;38;114mpackage[0m[38;2;248;248;242m [0m[38;2;249;38;114mbody[0m[38;2;248;248;242m [0m[38;2;166;226;46mClick[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m--------------[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  DEBOUNCE  --[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m--------------[0m

[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Ideally, in a separate package.[0m

[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  should be [], but not fixed yet in GCC 11.[0m
[38;2;249;38;114m   [0m[38;2;166;226;46mCurrent_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Matrix := [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => False]];[0m
[38;2;249;38;114m   [0m[38;2;166;226;46mNew_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Matrix := [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => False]];[0m
[38;2;249;38;114m   [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m   Nb_Bounce : Natural := 5;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mUpdate[0m[38;2;248;248;242m (NewS : Key_Matrix) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Boolean [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  The new state is the same as the current stable state => Do nothing.[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Current_Status = NewS [0m[38;2;249;38;114mthen[0m
[38;2;249;38;114m         [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m False;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m      [0m[38;2;249;38;114mif[0m[38;2;248;248;242m New_Status /= NewS [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m         [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  The new state differs from the previous[0m
[38;2;248;248;242m         [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  new state (bouncing) => reset[0m
[38;2;249;38;114m         [0m[38;2;166;226;46mNew_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= NewS;[0m
[38;2;249;38;114m         [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114melse[0m
[38;2;248;248;242m         [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  The new state hasn't changed since last[0m
[38;2;248;248;242m         [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  update => towards stabilization.[0m
[38;2;249;38;114m         [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Since + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m      [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Since > Nb_Bounce [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mdeclare[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mTmp[0m[38;2;249;38;114m :[0m[38;2;248;248;242m [0m[38;2;249;38;114mconstant[0m[38;2;248;248;242m Key_Matrix := Current_Status;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m            [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  New state has been stable enough.[0m
[38;2;248;248;242m            [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Latch it and notifies caller.[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mCurrent_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= New_Status;[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mNew_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Tmp;[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mSince[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m         [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m True;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114melse[0m
[38;2;248;248;242m         [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Not there yet[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m False;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mUpdate[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Matrix[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Could use := []; but GNAT 12 has a bug (fixed in upcoming 13)[0m
[38;2;249;38;114m   [0m[38;2;166;226;46mRead_Status[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Matrix := [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => False]];[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Events[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Events [0m[38;2;249;38;114mis[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mNum_Evt[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mNew_S[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Matrix [0m[38;2;249;38;114mrenames[0m[38;2;248;248;242m Read_Status;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      Get_Matrix;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Update (New_S) [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m I [0m[38;2;249;38;114min[0m[38;2;248;248;242m Current_Status'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m ([0m[38;2;190;132;255m1[0m[38;2;248;248;242m) [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m J [0m[38;2;249;38;114min[0m[38;2;248;248;242m Current_Status'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m ([0m[38;2;190;132;255m2[0m[38;2;248;248;242m) [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mif[0m[38;2;248;248;242m ([0m[38;2;249;38;114mnot[0m[38;2;248;248;242m New_Status (I, J) [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m Current_Status (I, J))[0m
[38;2;248;248;242m                 [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m (New_Status (I, J) [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m Current_Status (I, J))[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mthen[0m
[38;2;249;38;114m                  [0m[38;2;166;226;46mNum_Evt[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Num_Evt + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m         [0m[38;2;249;38;114mdeclare[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mEvts[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Events (Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m .. Num_Evt);[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mCursor[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m .. Num_Evt + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m := [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m I [0m[38;2;249;38;114min[0m[38;2;248;248;242m Current_Status'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m ([0m[38;2;190;132;255m1[0m[38;2;248;248;242m) [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m J [0m[38;2;249;38;114min[0m[38;2;248;248;242m Current_Status'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m ([0m[38;2;190;132;255m2[0m[38;2;248;248;242m) [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m                  [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m New_Status (I, J)[0m
[38;2;248;248;242m                    [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m Current_Status (I, J)[0m
[38;2;248;248;242m                  [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m                     [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Pressing I, J[0m
[38;2;248;248;242m                     Evts (Cursor) := [[0m
[38;2;248;248;242m                                       Evt => Press,[0m
[38;2;248;248;242m                                       Col => I,[0m
[38;2;248;248;242m                                       Row => J[0m
[38;2;248;248;242m                                      ];[0m
[38;2;249;38;114m                     [0m[38;2;166;226;46mCursor[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Cursor + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m                  [0m[38;2;249;38;114melsif[0m[38;2;248;248;242m New_Status (I, J)[0m
[38;2;248;248;242m                    [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m Current_Status (I, J)[0m
[38;2;248;248;242m                  [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m                     [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Release I, J[0m
[38;2;248;248;242m                     Evts (Cursor) := [[0m
[38;2;248;248;242m                                       Evt => Release,[0m
[38;2;248;248;242m                                       Col => I,[0m
[38;2;248;248;242m                                       Row => J[0m
[38;2;248;248;242m                                      ];[0m
[38;2;249;38;114m                     [0m[38;2;166;226;46mCursor[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Cursor + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m                  [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Evts;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m      [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [];[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Events[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Matrix[0m[38;2;248;248;242m  [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;117;113;94m--[0m[38;2;117;113;94m return Key_Matrix is[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Row [0m[38;2;249;38;114min[0m[38;2;248;248;242m Keys.Rows'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m         Keys.Rows (Row).Clear;[0m

[38;2;248;248;242m         [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m Col [0m[38;2;249;38;114min[0m[38;2;248;248;242m Keys.Cols'[0m[38;2;249;38;114mRange[0m[38;2;248;248;242m [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m            Read_Status (Col, Row) := [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m Keys.Cols (Col).Set;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         Keys.Rows (Row).Set;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Matrix[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  End of DEBOUNCE[0m

[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m------------[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Layout  --[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m------------[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mpackage[0m[38;2;248;248;242m [0m[38;2;166;226;46mEvents_Ring_Buffers[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114mnew[0m[38;2;248;248;242m Chests.Ring_Buffers[0m
[38;2;248;248;242m     (Element_Type => Event,[0m
[38;2;248;248;242m      Capacity     => [0m[38;2;190;132;255m16[0m[38;2;248;248;242m);[0m

[38;2;249;38;114m   [0m[38;2;166;226;46mQueued_Events[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Events_Ring_Buffers.Ring_Buffer;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Statet [0m[38;2;249;38;114mis[0m[38;2;248;248;242m (Normal_Key, Layer_Mod, None);[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m State [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114mrecord[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mTyp[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Statet;[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mCode[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Code_T;[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mLayer_Value[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural;[0m
[38;2;248;248;242m      [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Col : ColR;[0m
[38;2;248;248;242m      [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Row : RowR;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend record[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m State_Array [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (ColR, RowR) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m State;[0m
[38;2;249;38;114m   [0m[38;2;166;226;46mStates[0m[38;2;249;38;114m :[0m[38;2;248;248;242m State_Array := [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => [[0m[38;2;249;38;114mothers[0m[38;2;248;248;242m => (Typ => None, Code => No, Layer_Value => [0m[38;2;190;132;255m0[0m[38;2;248;248;242m)]];[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mKw[0m[38;2;248;248;242m (Code : Key_Code_T) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Action [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m (T => Key, C => Code, L => [0m[38;2;190;132;255m0[0m[38;2;248;248;242m);[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mKw[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mLw[0m[38;2;248;248;242m (V : Natural) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Action [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m (T => Layer, C => No, L => V);[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mLw[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  FIXME: hardcoded max number of events[0m
[38;2;248;248;242m   [0m[38;2;249;38;114msubtype[0m[38;2;248;248;242m Events_Range [0m[38;2;249;38;114mis[0m[38;2;248;248;242m Natural [0m[38;2;249;38;114mrange[0m[38;2;248;248;242m [0m[38;2;190;132;255m0[0m[38;2;248;248;242m .. [0m[38;2;190;132;255m60[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mtype[0m[38;2;248;248;242m Array_Of_Reg_Events [0m[38;2;249;38;114mis[0m[38;2;248;248;242m [0m[38;2;249;38;114marray[0m[38;2;248;248;242m (Events_Range) [0m[38;2;249;38;114mof[0m[38;2;248;248;242m Event;[0m

[38;2;249;38;114m   [0m[38;2;166;226;46mStamp[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mRegister_Events[0m[38;2;248;248;242m (L : Layout; Es : Events) [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mStamp[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Stamp + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m      Log ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mReg events: [0m[38;2;230;219;116m"[0m[38;2;248;248;242m & Stamp'Image);[0m
[38;2;248;248;242m      Log (Es'Length'Image);[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m E [0m[38;2;249;38;114mof[0m[38;2;248;248;242m Es [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mdeclare[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Events_Ring_Buffers.Is_Full (Queued_Events) [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mraise[0m[38;2;248;248;242m Program_Error;[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m            Events_Ring_Buffers.Append (Queued_Events, E);[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         [0m[38;2;117;113;94m--[0m[38;2;117;113;94m         Log ("Reg'ed events:" &  Events_Mark'Image);[0m
[38;2;248;248;242m         Log ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mReg'ed events:[0m[38;2;230;219;116m"[0m[38;2;248;248;242m &  Events_Ring_Buffers.Length (Queued_Events)'Image);[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mRegister_Events[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mRelease[0m[38;2;248;248;242m (Col: Colr; Row: Rowr) [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mif[0m[38;2;248;248;242m States (Col, Row).Typ = None [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mraise[0m[38;2;248;248;242m Program_Error;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      States (Col, Row) := (Typ => None, Code => No, Layer_Value => [0m[38;2;190;132;255m0[0m[38;2;248;248;242m);[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mRelease[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Current_Layer[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Natural [0m[38;2;249;38;114mis[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mL[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m S [0m[38;2;249;38;114mof[0m[38;2;248;248;242m States [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mif[0m[38;2;248;248;242m S.Typ = Layer_Mod [0m[38;2;249;38;114mthen[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mL[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= L + S.Layer_Value;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m      [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m L;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Current_Layer[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Tick the event.[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  Returns TRUE if it needs to stay in the queued events[0m
[38;2;248;248;242m   [0m[38;2;117;113;94m--[0m[38;2;117;113;94m  FALSE if the event has been consumed.[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m (L: Layout; E : [0m[38;2;249;38;114min[0m[38;2;248;248;242m [0m[38;2;249;38;114mout[0m[38;2;248;248;242m Event) [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Boolean [0m[38;2;249;38;114mis[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mCurrent_Layer[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := Get_Current_Layer;[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mA[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Action [0m[38;2;249;38;114mrenames[0m[38;2;248;248;242m L (Current_Layer, E.Row, E.Col);[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mcase[0m[38;2;248;248;242m E.Evt [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m Press =>[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mcase[0m[38;2;248;248;242m A.T [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m Key =>[0m
[38;2;248;248;242m                  States (E.Col, E.Row) :=[0m
[38;2;248;248;242m                    (Typ => Normal_Key,[0m
[38;2;248;248;242m                     Code => A.C,[0m
[38;2;248;248;242m                     Layer_Value => [0m[38;2;190;132;255m0[0m[38;2;248;248;242m);[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m Layer =>[0m
[38;2;248;248;242m                  States (E.Col, E.Row) := (Typ => Layer_Mod, Layer_Value => A.L, Code => No);[0m
[38;2;248;248;242m               [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m [0m[38;2;249;38;114mothers[0m[38;2;248;248;242m =>[0m
[38;2;248;248;242m                  [0m[38;2;249;38;114mraise[0m[38;2;248;248;242m Program_Error;[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mend case[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m         [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m Release =>[0m
[38;2;248;248;242m            Release (E.Col, E.Row);[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend case[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m False;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m;[0m

[38;2;249;38;114m   [0m[38;2;166;226;46mLast_Was_Empty_Log[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Boolean := False;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m (L : Layout) [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m I [0m[38;2;249;38;114min[0m[38;2;248;248;242m [0m[38;2;190;132;255m1[0m[38;2;248;248;242m .. Events_Ring_Buffers.Length(Queued_Events) [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mdeclare[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mE[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Event := Events_Ring_Buffers.Last_Element (Queued_Events);[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m            Events_Ring_Buffers.Delete_Last (Queued_Events);[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Tick (L, E) [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m               Events_Ring_Buffers.Prepend (Queued_Events, E);[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;249;38;114mnot[0m[38;2;248;248;242m Last_Was_Empty_Log [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m Events_Ring_Buffers.Length(Queued_Events) /= [0m[38;2;190;132;255m0[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m         Log ([0m[38;2;230;219;116m"[0m[38;2;230;219;116mEnd Tick layout, events: [0m[38;2;230;219;116m"[0m[38;2;248;248;242m & Events_Ring_Buffers.Length(Queued_Events)'Image);[0m
[38;2;249;38;114m         [0m[38;2;166;226;46mLast_Was_Empty_Log[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Events_Ring_Buffers.Length(Queued_Events) = [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mTick[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Key_Codes[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Key_Codes_T [0m[38;2;249;38;114mis[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mCodes[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Codes_T ([0m[38;2;190;132;255m0[0m[38;2;248;248;242m .. [0m[38;2;190;132;255m10[0m[38;2;248;248;242m);[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mWm[0m[38;2;249;38;114m:[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m S [0m[38;2;249;38;114mof[0m[38;2;248;248;242m States [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mif[0m[38;2;248;248;242m S.Typ = Normal_Key [0m[38;2;249;38;114mand[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m            (S.Code < LCtrl [0m[38;2;249;38;114mor[0m[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m S.Code > RGui)[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m            Codes (Wm) := S.Code;[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mWm[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= Wm + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m      [0m[38;2;249;38;114mif[0m[38;2;248;248;242m Wm = [0m[38;2;190;132;255m0[0m[38;2;248;248;242m [0m[38;2;249;38;114mthen[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [];[0m
[38;2;248;248;242m      [0m[38;2;249;38;114melse[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Codes ([0m[38;2;190;132;255m0[0m[38;2;248;248;242m .. Wm - [0m[38;2;190;132;255m1[0m[38;2;248;248;242m);[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Key_Codes[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mfunction[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Modifiers[0m[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m Key_Modifiers [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m      [0m[38;2;249;38;114muse[0m[38;2;248;248;242m USB.Device.HID.Keyboard;[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mKM[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Key_Modifiers ([0m[38;2;190;132;255m1[0m[38;2;248;248;242m..[0m[38;2;190;132;255m8[0m[38;2;248;248;242m);[0m
[38;2;249;38;114m      [0m[38;2;166;226;46mI[0m[38;2;249;38;114m :[0m[38;2;248;248;242m Natural := [0m[38;2;190;132;255m0[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mfor[0m[38;2;248;248;242m S [0m[38;2;249;38;114mof[0m[38;2;248;248;242m States [0m[38;2;249;38;114mloop[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mif[0m[38;2;248;248;242m S.Typ = Normal_Key [0m[38;2;249;38;114mthen[0m
[38;2;249;38;114m            [0m[38;2;166;226;46mI[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= I + [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mcase[0m[38;2;248;248;242m S.Code [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m LCtrl =>[0m
[38;2;248;248;242m                 KM(I) := Ctrl_Left;[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m RCtrl =>[0m
[38;2;248;248;242m                 KM(I) := Ctrl_Right;[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m LShift =>[0m
[38;2;248;248;242m                 KM(I) := Shift_Left;[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m RShift =>[0m
[38;2;248;248;242m                 KM(I) := Shift_Right;[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m LAlt =>[0m
[38;2;248;248;242m                 KM(I) := Alt_Left;[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m RAlt =>[0m
[38;2;248;248;242m                 KM(I) := Alt_Right;[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m LGui =>[0m
[38;2;248;248;242m                 KM(I) := Meta_Left;[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m RGui =>[0m
[38;2;248;248;242m                 KM(I) := Meta_Right;[0m
[38;2;248;248;242m              [0m[38;2;249;38;114mwhen[0m[38;2;248;248;242m [0m[38;2;249;38;114mothers[0m[38;2;248;248;242m =>[0m
[38;2;249;38;114m                 [0m[38;2;166;226;46mI[0m[38;2;249;38;114m :[0m[38;2;248;248;242m= I - [0m[38;2;190;132;255m1[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m            [0m[38;2;249;38;114mend case[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m         [0m[38;2;249;38;114mend if[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mend loop[0m[38;2;248;248;242m;[0m
[38;2;248;248;242m      [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m KM ([0m[38;2;190;132;255m1[0m[38;2;248;248;242m..I);[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mGet_Modifiers[0m[38;2;248;248;242m;[0m

[38;2;248;248;242m   [0m[38;2;249;38;114mprocedure[0m[38;2;248;248;242m [0m[38;2;166;226;46mInit[0m[38;2;248;248;242m [0m[38;2;249;38;114mis[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mbegin[0m
[38;2;248;248;242m      Events_Ring_Buffers.Clear (Queued_Events);[0m
[38;2;248;248;242m   [0m[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mInit[0m[38;2;248;248;242m;[0m

[38;2;249;38;114mend[0m[38;2;248;248;242m [0m[38;2;166;226;46mClick[0m[38;2;248;248;242m;[0m
